/* 
 * cms，一个基于J2EE架构内容管理系统
 * Copyright © GrayRabbit Co., Ltd. All rights reserved.
 * Department:运营department
 * 更多信息请访问：
 * http://code.google.com/p/gray-rabbit-cms/
 */
package org.grayrabbit.cms.service.system.impl;

import java.util.List;

import org.grayrabbit.cms.dao.system.ConfigDao;
import org.grayrabbit.cms.entity.Config;
import org.grayrabbit.cms.service.system.ConfigService;
import org.grayrabbit.cms.vo.system.ConfigBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import org.grayrabbit.dao.util.Page;
import org.grayrabbit.service.impl.GenericServiceImpl;
/**
 * <b>OperLog</b>的service实现类，事务加此处：





 * @version 1.0,创建时间: 2011-05-16 15:55:00  
 */
@Service
@Transactional
public class ConfigServiceImpl extends GenericServiceImpl implements ConfigService {
	/**
	 * 注入dao层：
	 */
	@Autowired
	@Qualifier("configDaoImpl")
	private ConfigDao configDao;
	
	/**
	 * 此方法执行时为只读事务：
	 * @see ConfigService#getOperLog(String)
	 */
	@Transactional(readOnly=true)
	public Config getConfig(final String configId){
		Config config = configDao.findById(configId);
		configDao.initialize(config);
		return config;
	}
	
	/**
	 * @see ConfigService#delete(String)
	 */
	@Transactional
	public void delete(final Config config) {
		configDao.makeTransient(config);
		synchronized (ConfigContext.lock) {
			ConfigContext.remove(config.getConfigAttrKey());
			ConfigContext.UPDATE_FLAG = false;
		}
	}
	
	/**
	 * @see ConfigService#save(OperLog)
	 */
	@Transactional
	public void save(final Config config) {
		configDao.makePersistent(config);		
		synchronized (ConfigContext.lock) {
			ConfigContext.put(config);
			ConfigContext.UPDATE_FLAG = false;
		}
	}
	
	/**
	 * 此方法执行时为只读事务：
	 * @see ConfigService#getPage(ConfigBean)
	 */
	@Transactional(readOnly=true)
	public Page<Config> getPage(final ConfigBean configBean){
		Page<Config> page =  new Page<Config>();
		page.setTotal(configDao.count(configBean));
		page.setResult(configDao.findByQc(configDao.assembly(configBean)));
		return page;
	}

	/**
	 * 此方法执行时为只读事务：
	 * @see ConfigService#list(Page, ConfigBean)
	 */
	public void list(Page<Config> page, ConfigBean configBean) {
		if(page==null)
			return;
		if(page.isAutoCount()){
			page.setTotal(configDao.count(configBean));
		}
		page.setResult(configDao.findByPage(page,configBean));
	}
	
	/**
	 * 根据主键id列删除，批量删除OperLog
	 * @see ConfigService#delete(String[])
	 */
	public void delete(final String[] key) {
		int i =0;
		for(String id : key){
			configDao.makeTransient(configDao.findById(id));
			i++;
			if(i==MAX_CLEAR)
				configDao.clear();
		}
		synchronized (ConfigContext.lock) {
			ConfigContext.UPDATE_FLAG = true;
		}
		
	}

	/**
	 * 批量编辑
	 */
	@Transactional
	public void batchUpdate(List<Config> objList) {
		if(objList!=null){
			synchronized (ConfigContext.lock) {
				for(Config obj:objList){
					configDao.makePersistent(obj);
					ConfigContext.put(obj);
				}
				ConfigContext.UPDATE_FLAG = false;
			}
		}
	}

	/**
	 * 根据属性key获取相应的配置
	 */
	public Config getConfigByAttrKey(String attrKey) {
		if(ConfigContext.UPDATE_FLAG){
			synchronized (ConfigContext.lock) {
				List<Config> configs = configDao.findAll();
				for (Config config : configs) {
					ConfigContext.put(config);
				}
				ConfigContext.UPDATE_FLAG = false;
			}
			
		}
		return ConfigContext.get(attrKey);
	}
	
	public List<Config> getConfigs(ConfigBean configBean){
		return configDao.getConfigs(configBean);
	}
 
}